package com.fary.context.event;

import com.fary.context.ApplicationEvent;
import com.fary.context.ApplicationListener;
import com.fary.core.ResolvableType;

public interface ApplicationEventMulticaster {

	/**
	 * 添加监听器以接收所有的事件通知
	 */
	void addApplicationListener(ApplicationListener<?> listener);

	/**
	 * 添加监听器以接收所有的事件通知，参数是监听器bean名称
	 */
	void addApplicationListenerBean(String listenerBeanName);

	/**
	 * 从通知列表中删除监听器
	 * @param listener 将被删除的监听器
	 */
	void removeApplicationListener(ApplicationListener<?> listener);

	/**
	 * 从通知列表中删除监听器
	 * @param listenerBeanName 将被删除的监听器
	 */
	void removeApplicationListenerBean(String listenerBeanName);

	/**
	 * 删除注册到代理上的所有监听器
	 * 在remove调用之后，代理不会对事件通知执行任何操作直到有新的监听器注册
	 */
	void removeAllListeners();

	/**
	 * 将给定的事件广播到对应的监听器上
	 * @param event 需要广播的事件
	 */
	void multicastEvent(ApplicationEvent event);

	/**
	 * 将应用程序事件广播到对应的监听器上
	 * @param event 需要广播的事件
	 * @param eventType 事件类型
	 */
	void multicastEvent(ApplicationEvent event, ResolvableType eventType);

}